package com.hhf.rpc.core;

import com.hhf.rpc.core.config.RegistryConfig;
import com.hhf.rpc.core.config.RpcConfig;
import com.hhf.rpc.core.constant.RpcConstant;
import com.hhf.rpc.core.registry.Registry;
import com.hhf.rpc.core.registry.RegistryFactory;
import com.hhf.rpc.core.util.RpcConfigUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * @Author hhf
 * @Date 2024/10/16
 * @Description rpc配置初始化
 */
@Slf4j
public class RpcApplication {

    private static volatile RpcConfig rpcConfig;

    /**
     * 传入config实现初始化
     * @param newRpcConfig
     */
    public static void init(RpcConfig newRpcConfig){
        //rpc初始化
        rpcConfig = newRpcConfig;
        log.info("rpc config init,init={}",rpcConfig);

        //注册中心初始化
        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        String serviceKey = registryConfig.getRegistry();
        Registry registry = RegistryFactory.getRegistry(serviceKey);
        registry.init(registryConfig);
        log.info("registry init,init={}",registryConfig);

        //watch
        Runtime.getRuntime().addShutdownHook(new Thread(registry::destory));
    }

    /**
     * rpc默认初始化
     * @return
     */
    public static void init(){
        RpcConfig newRpcConfig = null;
        try {
            newRpcConfig = RpcConfigUtil.loadRpcConfig(RpcConfig.class, RpcConstant.RPC_CONFIG_PREFIX);
            log.info("检测到配置文件application.properties");
        } catch (Exception e) {
//            e.printStackTrace();
            log.warn("未检测到配置文件application.properties,正在使用默认配置");
            //配置加载失败,使用默认值
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }

    /**
     * 双检索单例模式,实现懒加载(只有在getRpcConfig的时候才加载配置文件)
     * @return
     */
    public static RpcConfig getRpcConfig(){
        if (rpcConfig == null){
            synchronized (RpcApplication.class){
                if (rpcConfig == null){
                    init();
                }
            }
        }
        return rpcConfig;
    }
}
